home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / dmove86 / fat_dpb.c < prev    next >
Text File  |  1994-08-16  |  2KB  |  83 lines

  1. /*
  2.  
  3. fat_dpb.c -- FATとDPBの操作関数
  4.  
  5. */
  6.  
  7. #include<stdio.h>
  8. #include<dos.h>
  9. #include<ctype.h>
  10. #include<farstr.h>
  11. #include"dmove86.h"
  12.  
  13. int    getdpb(void)
  14. {
  15.     union REGS    regs;
  16.  
  17.     regs.h.ah = 0x32;
  18.     regs.h.dl = Drive + 1;
  19.     int86y(0x21,®s,®s);
  20.  
  21.     if    (regs.h.al == 0xff)
  22.         return -1;
  23.  
  24.     Dpb = *(struct DPB far *)MK_FP(regs.x.ds, regs.x.bx);
  25.  
  26.     Fatsize = (Dpb.data_sec - Dpb.iplsectors
  27.             - Dpb.root_entry/(Dpb.seclen >> 5)) / Dpb.fatnum;
  28.  
  29.     return 0;
  30. }
  31.  
  32. unsigned short    huge    *getfat(void)
  33. {
  34.     unsigned int    af;
  35.     unsigned int    pos;
  36.  
  37.     char    huge    *buf;
  38.  
  39.     buf = (char huge *)farmalloc((unsigned long)Dpb.seclen * Fatsize);
  40.  
  41.     if    (buf == NULL) 
  42.         return NULL;
  43.  
  44.     for    (pos=0 ; pos<Fatsize ; pos++)
  45.     {
  46.         af = readabssec((void far *)(buf + (long)pos*Dpb.seclen),
  47.                         Dpb.iplsectors+pos,1,Drive);
  48.         if    (af&0x100)
  49.         {
  50.             dm_errmes("\aFAT読み込みに失敗しました.");
  51.             endscreen();
  52.         }
  53.     }
  54.  
  55.     if    (Dpb.maxclu < 0xff7)
  56.     {    /* 12ビットFAT */
  57.  
  58.         unsigned short huge     *fat;
  59.  
  60.         fat=(unsigned short huge *)farmalloc
  61.                 ((Dpb.maxclu+2) * sizeof(unsigned short));
  62.  
  63.         if    (fat == NULL)
  64.         {
  65.             farfree(buf);
  66.             return 0;
  67.         }
  68.  
  69.         for    (pos=0 ; pos < Dpb.maxclu/2 ; pos++)
  70.         {
  71.             fat[pos*2  ] = buf[pos*3  ]+ (buf[pos*3+1]&0x0f) * 256;
  72.             fat[pos*2+1] = buf[pos*3+1]/16    + buf[pos*3+2]*16;
  73.  
  74.             if    (fat[pos*2  ] > 0xff6)    fat[pos*2  ] |= 0xf000;
  75.             if    (fat[pos*2+1] > 0xff6)    fat[pos*2+1] |= 0xf000;
  76.         }
  77.         farfree(buf);
  78.         return fat;
  79.     }
  80.  
  81.     else     return (unsigned short huge *)buf;
  82. }
  83.